from info.models import User
from . import admin_bp
from flask import render_template, request, current_app, session, redirect, url_for,abort
import time
from datetime import datetime, timedelta
from info import constants



@admin_bp.route('/user_list')
def user_list():
    # ---------------------------展示管理员页面用户列表------------------------------------------
    # 1,获取查询页码,如果没有值就默认是第一页
    p = request.args.get("p", 1)
    #　２，页码校验
    try:
        p = int(p)
    except Exception as e:
        current_app.logger.error(e)
        p = 1
    user_list = []
    current_page = 1
    total_page = 1
    # 根据查询条件查询分页数据
    try:
        paginate = User.query.filter(User.is_admin == False).order_by(User.last_login.desc()) \
                .paginate(p, constants.ADMIN_USER_PAGE_MAX_COUNT, False)
        user_list = paginate.items
        current_page = paginate.page
        total_page = paginate.pages
    except Exception as e:
        current_app.logger.error(e)

    return abort(404)


    # 将返回列表转化成为字典
    user_dict_list = []
    for user in user_list if user_list else None:
        user_dict_list.append(user.to_dict())
        data = {
            'users': user_dict_list,
            'current_page': current_page,
            'total':total_pae
        }
    return render_template("admin/user_list.html", data=data)












# 127.0.0.1:5000/admin/user_count
@admin_bp.route('/user_count')
def user_count():
    """返回用户统计信息"""
    # 查询总人数
    total_count = 0
    try:
        # 统计普通用户总人数
        total_count = User.query.filter(User.is_admin == False).count()
    except Exception as e:
        current_app.logger.error(e)

    # 查询月新增数
    mon_count = 0
    try:
        """
        time.struct_time(tm_year=2018, tm_mon=12, tm_mday=4, tm_hour=16, tm_min=30, tm_sec=23, tm_wday=1, tm_yday=338, tm_isdst=0)

        当前月的第一天：2018-12-01
        下一个月第一天：2019-01-01
        下下一个月第一天：2019-02-01

        """
        now = time.localtime()
        # 每一个月的第一天:字符串数据
        mon_begin = '%d-%02d-01' % (now.tm_year, now.tm_mon)
        #  strptime:字符串时间转换成时间格式
        mon_begin_date = datetime.strptime(mon_begin, '%Y-%m-%d')
        # 本月新增人数：用户的创建时间 >= 本月第一天   01--->04表示本月新增人数
        mon_count = User.query.filter(User.is_admin == False, User.create_time >= mon_begin_date).count()
    except Exception as e:
        current_app.logger.error(e)

    # 查询日新增数
    day_count = 0
    try:
        """
        2018-12-04-00:00 ---> 2018-12-04-23:59
        2018-12-05-00:00 ---> 2018-12-05-23:59
        """
        # 一天的开始时间
        day_begin = '%d-%02d-%02d' % (now.tm_year, now.tm_mon, now.tm_mday)
        day_begin_date = datetime.strptime(day_begin, '%Y-%m-%d')
        # 本日新增人数：查询条件是：用户创建时间 > 今天的开始时间，表示今天新增人数
        day_count = User.query.filter(User.is_admin == False, User.create_time > day_begin_date).count()
    except Exception as e:
        current_app.logger.error(e)

    # 查询图表信息
    # 获取到当天2018-12-04-00:00:00时间

    now_date = datetime.strptime(datetime.now().strftime('%Y-%m-%d'), '%Y-%m-%d')
    # 定义空数组，保存数据
    active_date = []
    active_count = []

    """
    开始时间: 2018-12-04-00:00:00 - 0天
    结束时间：2018-12-04-24:00:00 = 开始时间 + 1天

    开始时间: 2018-12-04-00:00:00 - 1天  代表12-03
    结束时间：2018-12-03-24:00:00 = 开始时间 + 1天

    开始时间: 2018-12-04-00:00:00 - 2天  代表12-02
    结束时间：2018-12-02-24:00:00 = 开始时间 + 1天

    """
    # 依次添加数据，再反转
    for i in range(0, 31):  # 0 1 2.... 30
        # 获取一天的开始时间
        begin_date = now_date - timedelta(days=i)
        # 结束时间：2018-12-04-24:00:00 = 开始时间 + 1天
        end_date = begin_date + timedelta(days=1)
        # 添加每一天的时间到列表中
        active_date.append(begin_date.strftime('%Y-%m-%d'))
        count = 0
        try:
            # 用户最后一次登录时间 > 一天的开始时间
            # 用户最后一次登录时间 < 一天的结束时间
            # 一天内的活跃量
            count = User.query.filter(User.is_admin == False, User.last_login >= begin_date,
                                      User.last_login < end_date).count()
        except Exception as e:
            current_app.logger.error(e)
        # 将每一天的活跃量添加到列表
        active_count.append(count)

    # [12-04, 12-03.....]  --> [11-04, 11-05.....12-04]
    # 日期和数据反转
    active_date.reverse()
    active_count.reverse()

    data = {"total_count": total_count, "mon_count": mon_count, "day_count": day_count, "active_date": active_date,
            "active_count": active_count}

    return render_template('admin/user_count.html', data=data)


# 127.0.0.1:5000/admin/index
@admin_bp.route('/index', methods=['POST', "GET"])
def admin_index():
    return render_template("admin/index.html")


# 127.0.0.1:5000/admin/login
@admin_bp.route('/login', methods=['POST', "GET"])
def admin_login():
    """管理员登录接口"""
    if request.method == 'GET':
        """
        管理员用户登录优化：如果管理员已经登录，再次访问/admin/login,我们就把他引导到/admin/index
        """
        user_id = session.get("user_id")
        is_admin = session.get("is_admin", False)
        # 当前用户登录了，同时还需要是管理员
        if user_id and is_admin:
            return redirect(url_for("admin.admin_index"))
        else:
            return render_template("admin/login.html")

    # POST请求：后端管理员登录逻辑
    """
    1.获取参数
        1.1 username:管理员账号，password未加密密码
    2.校验参数
        2.1 非空判断
    3.逻辑处理
        3.0 根据账号username查询管理员用户是否存在
        3.1 校验密码
        3.2 保存管理员登录信息
    4.返回值
        登录成功
    """
    # 1.1 username:管理员账号，password未加密密码
    param_dict = request.form
    username = param_dict.get("username")
    password = param_dict.get("password")

    # 2.1 非空判断
    if not all([username, password]):
        return render_template("admin/login.html", errmsg="参数不足")

    # 3.0 根据账号username查询管理员用户是否存在
    try:
        admin_user = User.query.filter(User.mobile == username, User.is_admin == True).first()
    except Exception as e:
        current_app.logger.error(e)
        return render_template("admin/login.html", errmsg="查询管理员用户异常")

    if not admin_user:
        return render_template("admin/login.html", errmsg="管理员用户不存在")

    # 3.1 校验密码
    if not admin_user.check_passowrd(password):
        return render_template("admin/login.html", errmsg="密码填写错误")

    # 3.2 保存管理员登录信息
    session["user_id"] = admin_user.id
    session["nick_name"] = username
    session["mobile"] = username
    # 保存管理员身份
    session["is_admin"] = True

    # 4，登录成功,跳转到管理员首页
    return redirect(url_for("admin.admin_index"))